package com.wanghlme.bookstore.service.impl;

import com.alibaba.fastjson.JSON;
import com.wanghlme.bookstore.bean.Cart;
import com.wanghlme.bookstore.bean.CartItem;
import com.wanghlme.bookstore.entity.Book;
import com.wanghlme.bookstore.service.CartService;
import com.wanghlme.bookstore.util.CartUtil;
import com.wanghlme.bookstore.util.common.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 购物车操作实现
 *
 * @author WangHailong
 */
@Slf4j
@Service
public class CartServiceImpl implements CartService {
    /**
     * 向购物车中添加图书
     *
     * @param cart 待处理的购物车
     * @param book 图书信息
     * @return 一个 json 格式的字符串，包含数量和书名
     */
    @Override
    public String insertBook(Cart cart, Book book) {
        log.debug("正在调用 {} 方法", Thread.currentThread().getStackTrace()[1].getMethodName());
        Map<String, Object> result = new HashMap<>(2);
        if (cart == null || book == null) {
            result.put("totalCount", null);
            result.put("name", null);
            return JSON.toJSONString(result);
        }
        CartItem cartItem;
        Map<String, CartItem> map = cart.getCartMap();
        if (map != null) {
            cartItem = map.get(book.getBookId());
            if (cartItem != null) {
                cartItem.setCount(cartItem.getCount() + 1);
                cartItem.setPrice(book.getPrice(), cartItem.getCount());
            } else {
                cartItem = new CartItem();
                cartItem.setBook(book);
                cartItem.setCount(1);
                cartItem.setPrice(book.getPrice(), cartItem.getCount());
                map.put(book.getBookId(), cartItem);
            }
        } else {
            map = new HashMap<>();
            cartItem = new CartItem(book, 1, book.getPrice());
            map.put(book.getBookId(), cartItem);
        }

        cart.setCartMap(map);
        cart.setCount(CartUtil.getTotalCount(map));
        cart.setPrice(CartUtil.getTotalPrice(map));
        result.put("totalCount", cart.getCount());
        result.put("name", book.getName());
        return JSON.toJSONString(result);
    }

    /**
     * 更新购物车中某项商品的数量信息
     *
     * @param cart  待处理的购物车
     * @param book  图书信息
     * @param count 图书数量
     * @return 一个 json 格式的字符串，包含当前图书项总数，当前图书项总价，购物车内图书总价，购物车内图书总数
     */
    @Override
    public String updateBook(Cart cart, Book book, Integer count) {
        log.debug("正在调用 {} 方法", Thread.currentThread().getStackTrace()[1].getMethodName());
        Map<String, Object> result = new HashMap<>(4);
        if (cart == null || book == null) {
            result.put("count", null);
            result.put("itemTotalPrice", null);
            result.put("totalPrice", null);
            result.put("totalCount", null);
            return JSON.toJSONString(result);
        }
        /* 获取修改前购物车图书项映射 */
        Map<String, CartItem> tmpMap = cart.getCartMap();
        /* 获取修改前购物车图书项 */
        CartItem tmpCartItem = tmpMap.get(book.getBookId());

        /* 修改购物车图书项 */
        tmpCartItem.setCount(count);
        tmpCartItem.setPrice(book.getPrice(), tmpCartItem.getCount());
        /* 将修改后的图书项存入映射 */
        tmpMap.put(book.getBookId(), tmpCartItem);
        /* 将修改后的映射存入购物车 */
        cart.setCartMap(tmpMap);
        cart.setCount(CartUtil.getTotalCount(tmpMap));
        cart.setPrice(CartUtil.getTotalPrice(tmpMap));

        result.put("itemTotalCount", tmpCartItem.getCount());
        result.put("itemTotalPrice", tmpCartItem.getPrice());
        result.put("totalPrice", cart.getPrice());
        result.put("totalCount", cart.getCount());
        return JSON.toJSONString(result);
    }

    /**
     * 删除购物车中某项商品
     *
     * @param cart   待处理的购物车
     * @param bookId 图书 ID
     * @return 删除结果
     */
    @Override
    public boolean deleteBook(Cart cart, String bookId) {
        log.debug("正在调用 {} 方法", Thread.currentThread().getStackTrace()[1].getMethodName());
        if (cart == null || StringUtil.isNullEmptyBlank(bookId)) {
            return false;
        } else {
            cart.getCartMap().remove(bookId);
            return true;
        }
    }

    /**
     * 清空购物车
     *
     * @param cart 待处理的购物车
     * @return 清空结果
     */
    @Override
    public boolean clearCart(Cart cart) {
        log.debug("正在调用 {} 方法", Thread.currentThread().getStackTrace()[1].getMethodName());
        if (cart == null) {
            return false;
        } else {
            cart.getCartMap().clear();
            return true;
        }
    }
}
